home *** CD-ROM | disk | FTP | other *** search
- /*
- * $RCSfile: redoBtree.C,v $
- * $Revision: 1.1.1.1 $
- * $Date: 1996/05/04 21:55:58 $
- */
- /**********************************************************************
- * EXODUS Database Toolkit Software
- * Copyright (c) 1991 Computer Sciences Department, University of
- * Wisconsin -- Madison
- * All Rights Reserved.
- *
- * Permission to use, copy, modify and distribute this software and its
- * documentation is hereby granted, provided that both the copyright
- * notice and this permission notice appear in all copies of the
- * software, derivative works or modified versions, and any portions
- * thereof, and that both notices appear in supporting documentation.
- *
- * THE COMPUTER SCIENCES DEPARTMENT OF THE UNIVERSITY OF WISCONSIN --
- * MADISON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION.
- * THE DEPARTMENT DISCLAIMS ANY LIABILITY OF ANY KIND FOR ANY DAMAGES
- * WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
- *
- * The EXODUS Project Group requests users of this software to return
- * any improvements or extensions that they make to:
- *
- * EXODUS Project Group
- * c/o David J. DeWitt and Michael J. Carey
- * Computer Sciences Department
- * University of Wisconsin -- Madison
- * Madison, WI 53706
- *
- * or exodus@cs.wisc.edu
- *
- * In addition, the EXODUS Project Group requests that users grant the
- * Computer Sciences Department rights to redistribute these changes.
- **********************************************************************/
- #include "BTREEPAGE.h"
- #include "BT_Log.h"
- #include "bf_macro.h"
- #include "redo_intfuncs.h"
-
-
- #ifdef DEBUG
- int redoBtreeTrace = FALSE;
- #undef BT_TRACE
- #define BT_TRACE(x) { if (redoBtreeTrace) printf x; }
- extern char* BT_PrintKey(SMDATATYPE type, void* key, int len);
-
- #else /* def DEBUG */
- #define BT_TRACE(x)
- #endif /* def DEBUG */
-
-
- // call the friend separately to avoid g++ bug
- void redoBtree(LOGRECORDHDR* recHdr)
- {
- redoBtree_fr(recHdr);
- }
-
-
- void redoBtree_fr(LOGRECORDHDR* recHdr)
- {
-
- TRPRINT(TR_IO|TR_LOG, TR_LEVEL_1, ("lsn:%d", recHdr->recordLSN.offset));
-
- PID* pid = & recHdr->actionPid;
- TRPRINT(TR_IO|TR_LOG, TR_LEVEL_2, ("pid:%d", pid->page));
-
- //
- // Check to see if the operation needs to be redone
- //
- GROUPLINK* gLink;
- if (!redoCheckPage(recHdr, &gLink, PAGE_INDEX)) {
- //
- // Don't need to redo
- //
- TRPRINT(TR_RECOVER, TR_LEVEL_2, ("dirty page not present"));
- return;
- }
- CHECK_GROUPLINK_MAGIC(gLink);
-
- BTREEPAGE* bp = (BTREEPAGE*) gLink->bufFrame;
-
- //
- // redo
- //
- void* vptr = GET_LOG_IMAGE(recHdr, 0);
- BT_TRACE(("R(%d,%d): ", recHdr->recordLSN.offset, pid->page));
-
- switch (recHdr->action) {
- BT_Tuple* tp;
- BT_Tuple tmp;
- int keyExists;
- TWO slot;
- int i;
-
-
- case LOG_ACTION_BTREE_PAGE_INIT:
- {
- LogBtreePageInitData* rp = (LogBtreePageInitData*) vptr;
- BT_TRACE(("init\n"));
- bp->Init(*pid, rp->newLevel, rp->keyType);
- }
- break;
-
- case LOG_ACTION_BTREE_MODIFY_LINK:
- {
- LogBtreeModifyLinkData* rp = (LogBtreeModifyLinkData*) vptr;
- ASSERT3(bp->NextPage() == rp->oldNext);
- ASSERT3(bp->PrevPage() == rp->oldPrev);
- BT_TRACE(("modify link\n"));
- bp->btCtrl.next = rp->newNext;
- bp->btCtrl.prev = rp->newPrev;
- }
- break;
-
- case LOG_ACTION_BTREE_MODIFY_VECTOR0:
- {
- LogBtreeModifyVector0Data* rp =
- (LogBtreeModifyVector0Data*) vptr;
- ASSERT3(bp->FirstVector() == rp->oldPid0);
- BT_TRACE(("modify vec0\n"));
- bp->SetFirstVector(rp->newPid0);
- }
- break;
-
- case LOG_ACTION_BTREE_MODIFY_LEVEL:
- {
- LogBtreeModifyLevelData* rp = (LogBtreeModifyLevelData*) vptr;
- ASSERT3(bp->Level() == rp->oldLevel);
- BT_TRACE(("set level\n"));
- bp->SetLevel(rp->newLevel);
- }
- break;
-
- case LOG_ACTION_BTREE_PHYSIC_INSERT:
- {
- LogBtreePhysicInsertData* rp =
- (LogBtreePhysicInsertData*) vptr;
- ASSERT3(rp->startSlot >= 0 && rp->numSlots > 0);
- char* buff = rp->data;
- BT_TRACE(("physic insert"));
- for (i = rp->startSlot; i < rp->startSlot+rp->numSlots; i++) {
- tp = (BT_Tuple*) buff;
- BT_TRACE((" %d", * (int*) tp->KeyValue()));
- bp->InsertTuple(*tp, i);
- buff += tp->Size();
- }
- BT_TRACE(("\n"));
- /*
- BT_PrintFunc = IntPrint;
- bp->Print(UserBufGroup);
- */
- }
- break;
-
-
- case LOG_ACTION_BTREE_PHYSIC_DELETE:
- {
- LogBtreePhysicDeleteData* rp =
- (LogBtreePhysicDeleteData*) vptr;
- ASSERT3(rp->startSlot >= 0 && rp->numSlots > 0);
- BT_TRACE(("physic delete"));
- for (i = rp->startSlot + rp->numSlots - 1;
- i >= rp->startSlot; i--) {
- BT_TRACE((" %d", *(int*) bp->Tuple(i).KeyValue()));
- bp->RemoveTuple(i);
- }
- BT_TRACE(("\n"));
- /*
- BT_PrintFunc = IntPrint;
- bp->Print(UserBufGroup);
- */
- }
- break;
-
- case LOG_ACTION_BTREE_LOGIC_INSERT:
- {
- LogBtreeLogicInsertData* rp =
- (LogBtreeLogicInsertData*) vptr;
-
- keyExists = bp->Search(rp->keyLen, rp->Key(),
- SMCOMPFUNC[rp->keyType],slot);
- ASSERT3(bp->IsLeaf());
- BT_TRACE(("logic insert %s\n", BT_PrintKey(rp->keyType,
- rp->Key(), rp->keyLen)));
- ASSERT3(rp->elSize > 0 && rp->elSize <= SM_MAXELEMLEN);
- if (keyExists) {
- ASSERT1(!rp->unique);
- if (bp->AddElem(slot, rp->El())) {
- SM_ERROR(TYPE_FATAL, Active->errno);
- }
- }
- else {
- tmp.Create(rp->keyLen, rp->Key(), rp->El(), rp->elSize);
- bp->InsertTuple(tmp, slot);
- }
- }
- break;
-
-
- case LOG_ACTION_BTREE_LOGIC_DELETE:
- {
- LogBtreeLogicDeleteData* rp =
- (LogBtreeLogicDeleteData*) vptr;
-
- keyExists = bp->Search(rp->keyLen, rp->Key(),
- SMCOMPFUNC[rp->keyType],slot);
- ASSERT3(bp->IsLeaf());
- BT_TRACE(("logic delete %s\n", BT_PrintKey(rp->keyType,
- rp->Key(), rp->keyLen)));
- ASSERT1(keyExists);
- ASSERT3(bp->Tuple(slot).KeyLen() == rp->keyLen);
- ASSERT3((SMCOMPFUNC[rp->keyType])(rp->keyLen, rp->Key(),
- rp->keyLen, bp->Tuple(slot).KeyValue()) == 0);
- ASSERT3(rp->elSize > 0 && rp->elSize <= SM_MAXELEMLEN);
- if (bp->RemoveElem(slot, rp->El())) {
- SM_ERROR(TYPE_FATAL, Active->errno);
- }
- if (bp->Tuple(slot).ElCnt() == 0) {
- bp->RemoveTuple(slot);
- }
- }
- break;
-
- case LOG_ACTION_BTREE_LOGIC_INCR_OIDCNT:
- {
- LogBtreeLogicIncrElCntData* rp =
- (LogBtreeLogicIncrElCntData*) vptr;
-
- keyExists = bp->Search(rp->keyLen, rp->key,
- SMCOMPFUNC[rp->keyType],slot);
- ASSERT1(keyExists);
- ASSERT3(bp->Tuple(slot).KeyLen() == rp->keyLen);
- ASSERT3((SMCOMPFUNC[rp->keyType])(rp->keyLen, rp->key, rp->
- keyLen, bp->Tuple(slot).KeyValue()) == 0);
- BT_TRACE(("++oidcnt\n"));
- bp->Tuple(slot).IncrElCnt();
- }
- break;
-
- case LOG_ACTION_BTREE_LOGIC_DECR_OIDCNT:
- {
- LogBtreeLogicDecrElCntData* rp =
- (LogBtreeLogicDecrElCntData*) vptr;
-
- keyExists = bp->Search(rp->keyLen, rp->key,
- SMCOMPFUNC[rp->keyType],slot);
- ASSERT1(keyExists);
- ASSERT3(bp->Tuple(slot).KeyLen() == rp->keyLen);
- ASSERT3((SMCOMPFUNC[rp->keyType])(rp->keyLen, rp->key, rp->
- keyLen, bp->Tuple(slot).KeyValue()) == 0);
-
- BT_TRACE(("--oidcnt\n"));
- bp->Tuple(slot).DecrElCnt();
- }
- break;
-
- case LOG_ACTION_BTREE_LOGIC_SET_OVERFLOW:
- {
- LogBtreeLogicSetOverflowData* rp =
- (LogBtreeLogicSetOverflowData*) vptr;
-
- keyExists = bp->Search(rp->keyLen, rp->KeyValue(),
- SMCOMPFUNC[rp->keyType], slot);
- ASSERT1(keyExists);
- tp = & bp->Tuple(slot);
- ASSERT3(tp->KeyLen() == rp->keyLen);
- ASSERT3(tp->ElCnt() == rp->numEl);
- ASSERT3((SMCOMPFUNC[rp->keyType])(rp->keyLen, rp->KeyValue(),
- rp->keyLen, tp->KeyValue()) == 0);
- BT_TRACE(("set overflow\n"));
- bp->SetOverflow(slot, rp->ovPid);
- }
- break;
-
-
- case LOG_ACTION_BTREE_LOGIC_RESET_OVERFLOW:
- {
- LogBtreeLogicSetOverflowData* rp =
- (LogBtreeLogicSetOverflowData*) vptr;
-
- keyExists = bp->Search(rp->keyLen, rp->KeyValue(),
- SMCOMPFUNC[rp->keyType], slot);
- ASSERT1(keyExists);
- tp = & bp->Tuple(slot);
- ASSERT3(tp->KeyLen() == rp->keyLen);
- ASSERT3(tp->ElCnt() == rp->numEl);
- ASSERT3((SMCOMPFUNC[rp->keyType])(rp->keyLen, rp->KeyValue(),
- rp->keyLen, tp->KeyValue()) == 0);
-
- BT_TRACE(("reset overflow\n"));
- /* if condition ?? */
- bp->SetUnderflow(slot, rp->numEl, rp->ElList());
- }
- break;
-
- default:
- SM_ERROR(TYPE_FATAL, esmINTERNAL);
- }
- ASSERT3(bp->CheckContent());
-
- bp->lrc() = recHdr->actionLRC;
-
- signalSemaphore(&gLink->pageHash->semaphore);
-
- bf_UnfixPage(gLink, BF_DEFAULT, TRUE);
- }
-